package structural.proxy.dynamic_proxy.jdk;

/**
 * @ClassName: MainTest
 * @Description: 测试类
 * @Author: liu-hao
 * @Date: 2023-04-09 21:46
 * @Version: 1.0
 **/
public class MainTest {
    public static void main(String[] args) {
        Subject realSubject = new RealSubject();

        // 设置JVM启动参数，将代理对象类保存到磁盘种中（具体先择下面那个参数，需要看ProxyGenerator.saveGeneratedFiles中存储的是那个参数）
        // System.getProperties().put("jdk.proxy.ProxyGenerator.saveGeneratedFiles","true"); // 新版本
        System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true"); // 老版本

        // 通过代理工厂获取代理对象
        Subject proxySubject = (Subject) ProxyFactory.getProxyInstance(realSubject);

        // 调用代理对象增强后的方法
        proxySubject.request();


        // JDK实现动态代理的原理其实很简单，就是采用字节重组重新生成对象来代替原始对象，以达到动态代理的目的，这里我们可以使用ProxyGenerator取到代理对象class文件的字节码我们可以输出到磁盘然后通过反编译查看
        // byte[] $Proxy0s = ProxyGenerator.generateProxyClass("$Proxy0", new Class[]{Subject.class});
        // try {
        //     FileOutputStream fileOutputStream = new FileOutputStream("./$Proxy1.class");
        //     fileOutputStream.write($Proxy0s);
        //     fileOutputStream.close();
        // } catch (Exception e) {
        //     e.printStackTrace();
        // }

    }
}
